import XLSXS from 'xlsx-js-style';
import * as XLSX from "xlsx"
import { ElMessage } from 'element-plus'
/**
 * excel导出 (基于封装的table数据进行导出) 单表头导出
 * @param tableData 需要导出的数据
 * @param headers 表头数据
 * @param title 标题
 */
const exportToExcel =(tableData,headers,title)=>{
    // 去除选择框
    headers = headers.filter( v => v.label !== '');
    // 根据headers生成表头
    let headerLabel = [];
    let headerValue = [];
    // 设置列宽
    let cols = [];
    headers.forEach((item)=>{
        if(item.value){
            headerLabel.push(item.label);
            headerValue.push(item.value);
        }
    });
    // 将数据源转成我们需要的二维数组
    const tableList = [];
    tableData.forEach((item)=>{
        let value = [];
        headerValue.forEach((item1,i) =>{
            let content = item[item1];
            cols[i] = { wch: content.length < 10? 13 : content.length+10 };
            value.push(content)
        });
        tableList.push(value)
    });

    /* 定义表头
        定义表头，每一行即是一个数组，数组中的元素即是一个个单元格内容。
        如果单元格不需要样式，那么每个元素类型为字符串即可。如：['一月（2022年01月）'],
        如果单元格需要样式，那么数组中的元素就需要为一个个对象，在此对象中定义单元格的样式等等。
        这里只针对第一行进行举例：
    */
    const header = [headerLabel];

    tableList.unshift(...header);// 将定义好的表头添加到 body 中
    const sheet = XLSXS.utils.aoa_to_sheet(tableList);// aoa_to_sheet 将二维数组转成 sheet

    //设置列宽
    sheet['!cols'] = cols; // 将cols添加到sheet中

    //设置行高
    const rows = [];
    sheet['!rows'] = rows; // 将rows添加到sheet中，设置行高
    //以下是样式设置，样式设置放在组织完数据之后，xlsx-js-style的核心API就是SheetJS的
    Object.keys(sheet).forEach(key => {
        // 非!开头的属性都是单元格
        if (!key.startsWith("!")) {
            sheet[key].s = {
                font: {
                    sz: "12"
                },
                alignment: {
                    horizontal: "center",
                    vertical: "center",
                    wrapText: true
                },
                border: {
                    top: { style: 'thin' },
                    right: { style: 'thin' },
                    bottom: { style: 'thin' },
                    left: { style: 'thin' }
                }
            };
        }
    })

    const workbook = XLSXS.utils.book_new();// 创建虚拟的 workbook
    XLSXS.utils.book_append_sheet(workbook, sheet, 'sheet名称'); // 向 workbook 中添加 sheet
    XLSXS.writeFile(workbook, title+'.xlsx'); // 导出 workbook
    ElMessage.success('已导出!')
};

/**
 * excel导入
 * @param file 需要导入的文件
 * @param headers 表头数据
 */
const importToExcel = (file,headers)=>{
    return new Promise((resolve,reject)=>{
        // 获取文件名
        const fileName = file.name;
        // 提取扩展名
        const fileExtension = fileName.split('.').pop().toLowerCase();
        const allowedExtensions = ['xlsx', 'xls'];

        if (!allowedExtensions.includes(fileExtension)) {
            ElMessage.warning('请选择表格文件!');
            return
        }
        // 去除选择框
        headers = headers.filter( v => v.label !== '');
        // 根据headers生成字段对应关系
        // 根据headers生成表头
        let headerLabel = [];
        let headerValue = [];
        headers.forEach((item)=>{
            if(item.value){
                headerLabel.push(item.label);
                headerValue.push(item.value);
            }
        });

        // 只能上传一个Excel，重复上传会覆盖之前的
        const reader = new FileReader();
        reader.readAsArrayBuffer(file);
        reader.onload = ()=> {
            const buffer = reader.result;
            const bytes = new Uint8Array(buffer);
            const length = bytes.byteLength;
            let binary = "";
            for (let i = 0; i < length; i++) {
                binary += String.fromCharCode(bytes[i]);
            }
            const wb = XLSX.read(binary, {
                type: "binary"
            });
            const outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);

            let data = [...outdata];

            // 这里是把表格里面的名称改成表格里面的字段
            data = data.map((item) => {
                const newItem ={};
                headerValue.forEach((item1,i)=>{
                    newItem[item1] = item[headerLabel[i]]
                });
                return newItem
            });
            resolve(data)
        };
    });
};

export default {
    exportToExcel,
    importToExcel
}




